﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Detai.Admin.Models;
using Detai.Admin.ViewModels;
using Detai.Lib.Common;
using Detai.Admin.Properties;
using Detai.Admin.Components;
namespace Detai.Admin.Controllers
{
    public class TaikhoanController : Controller
    {
        private bool isRoled = SystemConstants.Kiemtraquyen(1);
        DetaiDataContext eDataContext = new DetaiDataContext();

        [Authorize()]
        public ActionResult Index()
        {  
            //Kiểm tra quyền
            if (!isRoled) { return RedirectToAction("Index", "Thongbao", new { message = SystemConstants.Khongcoquyen }); }
            TaikhoanIndexViewModel model = new TaikhoanIndexViewModel();
            model.LoaiTK = Convert.ToInt32(UserState.getUserStateFromRequest("Taikhoan.LoaiTK", "LoaiTK", 0));
            model.Keyword = UserState.getUserStateFromRequest("User.Keyword", "Keyword", "").ToString();
            model.LoaiTaiKhoans = Utils.StringToDictionary(Settings.Default.LoaiTaiKhoan.ToString(), ",");
            model.TaiKhoans = eDataContext.TaiKhoans
                                            .Where( e => (model.LoaiTK > 0 ? e.LoaiTK == model.LoaiTK : true) &&
                                                (!string.IsNullOrEmpty(model.Keyword) && model.Keyword.Trim().Length >0 ? e.Tendangnhap.ToLower().Contains(model.Keyword.ToLower().Trim()) : true)                                               
                                                )
                                            .ToList();
            return View(model);
        }

        [Authorize()]
        public ActionResult Create()
        {
            // Kiểm tra quyền
            if (!isRoled) { return RedirectToAction("Index", "Thongbao", new { message = SystemConstants.Khongcoquyen }); }
            TaikhoanEditViewModel model = new TaikhoanEditViewModel();
            model.LoaiTaiKhoans = Utils.StringToDictionary(Settings.Default.LoaiTaiKhoan.ToString(), ",");
            model.Giangviens = eDataContext.Giangviens.ToList();
            return View(model);
        }

        [HttpPost]
        [Authorize()]
        public ActionResult Create(TaikhoanEditViewModel formData)
        {
            try
            {
                formData.TaiKhoan.Ngaytao = DateTime.Now;
                var isTaikhoan = eDataContext.TaiKhoans.Where(e => e.Tendangnhap.Trim().ToLower() == formData.TaiKhoan.Tendangnhap.Trim().ToLower()).Count();
                // Kiểm tra xem tên đăng nhập đã có người sử dụng hay chưa?
                if (isTaikhoan > 0)
                {
                    ViewData["MessageInfo"] = "Tên đăng nhập:\"" + formData.TaiKhoan.Tendangnhap + "\" đã tồn tại trong hệ thống. Bạn không thể sử dụng tên đăng nhập này.";
                    return View();
                }
                eDataContext.TaiKhoans.InsertOnSubmit(formData.TaiKhoan);
                eDataContext.SubmitChanges();
                if (formData.MaGiangvien > 0)
                {
                    var giangvien = eDataContext.Giangviens.FirstOrDefault(e => e.MaGV == formData.MaGiangvien);
                    giangvien.MaTK = formData.TaiKhoan.MaTK;
                    eDataContext.SubmitChanges();
                }
                return RedirectToAction("Index");
            }
            catch
            {
                ViewData["MessageInfo"] = "Không thêm được tài khoản. Bạn vui lòng xem lại dữ liệu đã nhập";
                return View();
            }
        }
        [Authorize()]
        public ActionResult Edit(int id)
        {
            TaikhoanEditViewModel model = new TaikhoanEditViewModel();
            model.LoaiTaiKhoans = Utils.StringToDictionary(Settings.Default.LoaiTaiKhoan.ToString(), ",");
            model.Giangviens = eDataContext.Giangviens.ToList();
            model.MaGiangvien = eDataContext.Giangviens.Where(e => e.MaTK == id).Select(e => e.MaGV).FirstOrDefault();
            model.TaiKhoan = eDataContext.TaiKhoans.FirstOrDefault(e => e.MaTK == id);
            return View(model);
        }

        [HttpPost]
        [Authorize()]
        public ActionResult Edit(int id, TaikhoanEditViewModel formData)
        {
            try
            {
                formData.TaiKhoan = eDataContext.TaiKhoans.FirstOrDefault(e => e.MaTK ==id);
                UpdateModel(formData); 
                eDataContext.SubmitChanges();
                if (formData.MaGiangvien > 0)
                {
                    var giangvien = eDataContext.Giangviens.FirstOrDefault(e => e.MaGV == formData.MaGiangvien);
                    giangvien.MaTK = formData.TaiKhoan.MaTK;
                    eDataContext.SubmitChanges();
                }

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        [Authorize()]
        public ActionResult Delete(int id)
        {
            var item = eDataContext.TaiKhoans.FirstOrDefault(e => e.MaTK == id);
            return View(item);
        }

        [HttpPost]
        [Authorize()]
        public ActionResult Delete(int id, Lop fromdata)
        {
            try
            {
                var item = eDataContext.TaiKhoans.FirstOrDefault(e => e.MaTK == id);
                if (item != null)
                {
                    // Xóa mã tài khoản nếu tài khoản là của giảng viên
                    if (item.LoaiTK == 2)
                    {
                        var giangvien = eDataContext.Giangviens.FirstOrDefault(e => e.MaTK == id);
                        if (giangvien != null)
                        {
                            //Xóa các bài tập của giảng viên
                            var baitap = eDataContext.Baitaps.Where(e => e.MaGV == giangvien.MaGV).ToList();
                            // với mỗi bài tập xóa các bài giải và lớp học đc phân bài tập đó
                            foreach (var bt in baitap)
                            {
                                var listbaigiai = eDataContext.Baigiais.Where(e => e.MaBT == bt.MaBT).ToList();
                                if (listbaigiai.Count() > 0) eDataContext.Baigiais.DeleteAllOnSubmit(listbaigiai);
                                var listbaitap_lophoc = eDataContext.Lophoc_BTs.Where(e => e.MaBT == bt.MaBT).ToList();
                                if (listbaitap_lophoc.Count() > 0) eDataContext.Lophoc_BTs.DeleteAllOnSubmit(listbaitap_lophoc);
                            }
                            if (baitap.Count() > 0) eDataContext.Baitaps.DeleteAllOnSubmit(baitap);
                            // xóa giảng viên
                            eDataContext.Giangviens.DeleteOnSubmit(giangvien);
                        }
                    }
                    // Xóa mã tài khoản nếu tài khoản là của sinh viên
                    if (item.LoaiTK == 3)
                    {
                        var sinhvien = eDataContext.Sinhviens.FirstOrDefault(e => e.MaTK == id);
                        if (sinhvien != null)
                        {
                            // Xóa danh sách bài giải của sinh viên
                            var listbaigiai = eDataContext.Baigiais.Where(e => e.MaSV == sinhvien.MaSV).ToList();
                            if (listbaigiai.Count() > 0) eDataContext.Baigiais.DeleteAllOnSubmit(listbaigiai);

                            // Xóa sinh viên
                            eDataContext.Sinhviens.DeleteOnSubmit(sinhvien);
                        }
                    }
                    eDataContext.TaiKhoans.DeleteOnSubmit(item);
                    eDataContext.SubmitChanges();
                }
                return RedirectToAction("Index");
            }
            catch
            {
                ViewData["MessageInfo"] = "Tài khoản này đã được cấp cho sinh viên hoặc giáo viên. Bạn muốn xóa tài khoản này thì phải xóa sinh viên hoặc giáo viên sở hữu tài khoản này trước";
                return View();
            }
        }

    }
}
